#ifndef __KEY_CODE_H__
#define __KEY_CODE_H__

#include "kb_net.h"
#include "kb_def.h"
#include "group-list.h"

#if 0
#define DEBUG
#endif


#define HIETH_TRACE_LEVEL	4
#define LEVEL_1		1
#define LEVEL_2		2
#define LEVEL_3		3
#define LEVEL_4		4
#define LEVEL_5		5
#define LEVEL_6		6
#define LEVEL_7		7
#define LEVEL_8		8

#define keycode_trace(level, msg...) do { \
		if((level) >= HIETH_TRACE_LEVEL) { \
			printf("\n\t[%s : %s : %d] ", __FILE__,__FUNCTION__, __LINE__); \
			printf(msg); \
			printf("\n"); \
		} \
	}while(0)


/* 
 * file name 
 */
#define MON_FILE	"mon.cfg"
#define CAM_FILE	"cam.cfg"
#define GROUP_FILE	"group.cfg"

/* 
 * monitor and camera of count 
 */
#define MONITOR_COUNT	100
#define CAMERA_COUNT	3000

/*
 * search type 
 */
#define MONITOR		0xFFFF
#define CAMERA		0xEEEE

typedef unsigned int TYPE;

#define MAX_MONITORS 64  //支持的最大监视器数

/*
 * group.cfg of operate
 */
typedef struct grouplist
{
	struct list_head list;
	CameraGroup	group;
}grouplist;

/*
 * 键盘处理的参数
 */
typedef struct operate_handle
{
	int monitor_num;  // 监视器编号
	int camera_num;	  // 摄像机编号	
	int run_val ;	  // 轮巡的分组编号
	int salvo_val;	  // 按组号轮巡
	int shot_value ;		// 调用预置位, 设置预置位
	int speed;				// PTZ控制速度
	enPtzAction action;		// PTZ控制类型
} operate_handle ;


//监视器轮巡状态
typedef enum 
{
	RUN_UNUSE = 0,  //未启用轮巡
	RUN_RUNNING = 1 ,	 //正在轮巡
	RUN_HOLD = 2 ,	 //暂停轮巡
}enRunState;


//监视器轮巡信息
typedef struct TMonitorRun
{
	int          MonitorNo;		//监视器编号
	int          GroupNo;		//分组编号
	enRunState   eRunState;		//轮巡状态	
	pthread_t    tid_run;		//轮巡线程

}TMonitorRun;  

static TMonitorRun g_MonitorRun[MAX_MONITORS];

static pthread_mutex_t g_RunMutex; //访问g_MonitorRun的互拆锁


/*
 * 打开文件
 */
FILE* open_file(char * file_name);

/*
 * 处理收到的键盘数据
 */
int ProcessKey(unsigned char * pKeyBuf) ; 

/*
 * 从文件读取配置信息,填充TDeviceInfo结构.
 */
int fill_struct_deviceinfo(unsigned char * file, TDeviceInfo * device);

/*
 * 搜索设备ID,返回相应结构.
 *	num : 设备ID
 *  type : MONITOR || CAMERA
 */
TDeviceInfo *search(unsigned int num, TYPE type);

/*
 * print result
 */
void print_result(grouplist *posnode);

/*
 * 搜索单个轮巡组号
 *
 * s_head: 表头
 * s_newnode : 新节点
 * num : 轮巡组号.
 */
int get_signle_group(grouplist * s_head, grouplist * s_newnode, int num);

/*
 * 搜索ID号
 *
 * s_head: 表头
 * s_newnode : 新节点
 * id : id号.
 */
int get_signle_group_id(grouplist * s_head, grouplist * s_newnode, int id);

/*
 * 通过 ID 号找到group组号
 */
int GetGroupNoByID(int id);


/*
 * 存入动态数组
 * num : 轮巡编号
 * len : 轮巡组长度
 */
grouplist ** group_item(int num, int * len);

/*
 * 打印设备结构信息
 */
void print_device_info(TDeviceInfo *pdevice);


//初始化监视器轮巡数据
int monitor_run_init(void) ;

//退出监视器轮巡数据
static int monitor_run_exit(TMonitorRun *pRun) ;

//轮巡处理
static int RunGroup(operate_handle * pOperVal) ;

//按组号轮巡的线程
static void *RunGroup_Thread(void * pParam) ;

/*
 * 切换摄像机
 */
static int switch_camera(operate_handle keycode_handle) ; 

/*
 * 云台控制,预置设置,预置调用
 */
static int PtzCtrl(operate_handle keycode_handle) ;

/*
 * 退出键盘所有线程
 */
int exit_thread_keyocde();

/*
 * 网络键盘操作开始
 */
int keycode_start();

/*
 * 网络键盘操作结束
 */
int keycode_stop();


/*
 * 搜索ID号
 */
TDeviceInfo *search_id(unsigned int id, TYPE type);

/*
 * 通过 ID 号找到监视器号
 */
int GetMonitorNoByID(int id);

/*
 * 通过 ID 号找到摄像机号
 */
int GetCameraNoByID(int id);

/*
 * 初始化,从配置文件取数据,只需运行一次.
 */
int init_camera_monitor(void);



#endif	/* __KEY_CODE_H__ */

